package com.herench.jwt.util;

import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Map;

/**
 * Copyright (C), Heren
 * FileName: com.herench.jwt.common.JWT
 * Author:   Squall
 * Date:     12/03/2018 14:40
 * Description: JWT_Test
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */


public class JWT {

    //secret code
    private static final String SECRET = "XX#$%()(#*!()!KL<><SADSADsdfkjsdrow32234545fdf>?N<:{LWPW";

    private static final String EXP = "Exp";
    private static final String PAYLOAD = "payload";


    /**
     * 加密，传入一个对象和有效期
     *
     * @param object
     * @param maxAge
     * @param <T>
     * @return
     */
    public static <T> String sign(T object, long maxAge) {
        try {
            final JWTSigner signer = new JWTSigner(SECRET);
        final Map<String, Object> claims = new HashMap<String, Object>();
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeValueAsString(object);
        claims.put(PAYLOAD, jsonString);
        claims.put(EXP, System.currentTimeMillis() + maxAge);
        return signer.sign(claims);
    } catch (Exception e) {
        return null;
    }
    }


    /**
     * 解密，传入一个加密后的token字符串和解密后的类型
     *
     * @param jwt
     * @param classT
     * @param <T>
     * @return
     */

    public static <T> T unsign(String jwt, Class<T> classT) {
        final JWTVerifier verifier = new JWTVerifier(SECRET);
        try {
            final Map<String, Object> claims = verifier.verify(jwt);
            if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {
                long exp = (Long) claims.get(EXP);
                long currentTimeMillis = System.currentTimeMillis();
                if (exp > currentTimeMillis) {
                    String json = (String) claims.get(PAYLOAD);
                    ObjectMapper objectMapper = new ObjectMapper();
                    return objectMapper.readValue(json, classT);
                }
            }
            return null;
        } catch (Exception e) {
            return null;
        }
    }


}